/* 
	在开发时，如无必要，请不要直接魔改模板的代码，以免在运行时出现意外bug
	这是模板为你预留一个文件，用来对接你的业务逻辑 
 */

import axios from 'axios'
import zm from '../static/zm'

export default function (sa_admin, sa) {


    // ================================= 示例：模板基础信息  =================================
    sa_admin.title = 'zm-admin';
    // sa_admin.logo_url = '图片地址';    // 设置logo图标地址   默认值空, 代表使用：./admin-logo.png
    // sa_admin.icon_url = '图片地址';    // 设置icon图标地址   默认值空, 代表使用：./favicon.ico


    // ================================= 示例：初始化菜单  =================================
    //sa_admin.initMenu(); // 初始化菜单, 不传参代表默认显示所有菜单 菜单在 ./sa-menu-list.js 里,
    // sa_admin.initMenu(['1', '1-1', '1-2', '4']); 	// 传入一个id数组, 显示指定菜单


    // ================================= 示例：设置头像昵称  =================================
    //
    sa_admin.$nextTick(function () {
        this.$bus.$on('initUser',(user)=>{
            sa_admin.initMenu();
            sa_admin.user=user
            initWs(sa_admin.user.id);
            sa_admin.user.avatar=user.avatar // 头像地址
            console.log('初始化WebSocket')
            this.zm.webSocket.connect()
            this.$bus.$emit("queryNoReadNotice")
            this.$bus.$emit("refUserPerm")
        })
        /* sa_admin.user = {
            username: 'root', // 昵称
            avatar: document.querySelector('.admin-logo').src // 头像地址
        } */
    })


    // ================================= 示例：js操作菜单  =================================

    // sa_admin.showHome();            // 显示主页选项卡
    // sa_admin.showTabById('home');    // 显示一个选项卡, 根据id
    // sa_admin.closeTabById('5-1');    // 关闭一个选项卡，根据 id （ 第二个参数可填关闭后的回调函数 ）
    // sa_admin.showMenuById('5-2');    // 打开一个 菜单，根据 id

    // 跨窗口通信
    // sa_admin.getView('5-2').f5();// 获取指定视图的组件对象，并调用其f5()函数，一般用于跨窗口通信

    // 以下写法，调用tab打开新窗口
    // var tab = {id: '5-1', name: '用户添加', view: () => import('@/sa-view/user/user-add.vue'), params: {username: '王铁汉2'} };
    // sa_admin.showTab(tab);


    // ================================= 示例：设置登录后的头像处，下拉可以出现的选项  =================================
    sa_admin.dropList = [ // 头像点击处可操作的选项
        {
            name: '我的资料', 
            click: function () {
                //sa_admin.$message('点击了我的资料，你可以参照文档重写此函数');
                zm.ok("该功能还在建设中")
            }
        },
        {
            name: '切换账号',
            click: function () {
                sa_admin.openLogin();	// 打开登陆视图
            }
        },
        {
            name: '退出登录',
            click: function () {
                // sa_admin.$message('点击了退出登录，你可以参照文档重写此函数');
                //这个{msg: '正在注销'}属于它的其他配置，详情可见sa.js，就是是cfg
                sa.confirm('退出登录？', function () {
                    sa.ajax2('/acc/exit', function () {
                        sa.alert('注销成功', function () {
                            sa_admin.openLogin();
                        })
                    }, {msg: '正在注销'});
                });
            }
        }
    ]

    // 初始化模板, 必须调用
    sa_admin.init();

// ================================= 关于websocket =================================

    zm.wsCallback = new Map()
    // 就是依据这个Key来寻找对应的回调函数。
    //公告的回调
    zm.wsCallback.set('notice', (data, ws) => {
        this.$bus.$emit("queryNoReadNotice")
        const h = this.$createElement;
        this.$notify({
            title: '提示',
            message: h('i', { style: 'color: teal'}, '您有一条新的公告等待查阅')
        });
    })
    
    function initWs(userId) {
        // 写入菜单 这里应该有两种模式，第一种演示模式，会带上原有项目中的样例
        zm.webSocket = new zm.createWS("ws", sa.cfg.ws_ip, sa.cfg.ws_port, userId,
            new function () {
                this.onopen = function (ev, ws) {
                    setTimeout(()=>{
                        zm.ok('WebSocket已连接')
                    },3000)   
                }
                this.onmessage = function (ev, ws) {
                    let data = JSON.parse(ev.data);
                    /* 注意这里，服务器传来的数据应该是这个格式
                    {
                    code: '', // 这个值决定了调用哪个回调函数。
                    data: xxxx, 这个值会传给回调函数
                    }
                    * */
                    let callback = zm.wsCallback.get(data.code);
                    console.log(ev)
                    console.log(ws)
                    if (callback){
                        return callback(data.data, ws);
                    } else {
                        return sa.error('接收到服务器推送过来的消息，但未找到对应的回调函数！')
                    }
    
                }
                this.onclose = function (ev, ws) {
                    sa.ok('WebSocket已关闭')
                }
                this.onerror = function (ev, ws) {
                    sa.error('WebSocket错误')
                }
                this.ping = function (ws) {
                    ws.send('ping...')
                }
            }, 10000, 3000, "blob")
    }
    

    
}
